﻿#宏定义 预设_缓存大小 512
#宏定义 预设_端口 27015

函数 整型 入口函数()
	//----------------------
	//声明并初始化变量
	WSAData 网络_数据
	整型 整型_结果

	套接字 连接套接字 = 无效的套接字
	SOCKADDR_IN_ULONG 客户端服务
	常量 字符型A *发送缓存 = A"这是一个测试"
	字符型A 接收缓存[预设_缓存大小]
	整型 接收大小 = 预设_缓存大小

	//----------------------
	// 初始化 Winsock
	整型_结果 = 网络_初始化(MAKEWORD(1, 1), &网络_数据)
	如果 (整型_结果 != 0)
		调试输出("网络_初始化 失败:", 整型_结果, 网络_获取最后错误信息())
		返回 1

	//----------------------
	// 创建一个用于连接服务器的 SOCKET
	连接套接字 = 网络_创建套接字(AF_INET, SOCK_STREAM, IPPROTO_TCP)
	如果 (无效的套接字 == 连接套接字)
		调试输出("网络_创建套接字 失败:", 网络_获取最后错误信息())
		网络_清理()
		返回 1

	//----------------------
	// sockaddr_in 结构体用于指定要连接的服务器的地址族、IP 地址和端口
	客户端服务.sin_family = AF_INET;
	客户端服务.sin_addr.S_addr = 网络_字符串IP转整型(A"127.0.0.1")
	客户端服务.sin_port = 网络_端口到网络短整型(预设_端口)
	
	//----------------------
	// 连接到服务器
	整型_结果 = 网络_连接(连接套接字, (SOCKADDR*) &客户端服务, 取类型大小(客户端服务))
	如果 (套接字错误 == 整型_结果)
		网络_关闭套接字(连接套接字)
		调试输出("网络_连接 失败:", 网络_获取最后错误信息())
		网络_清理()
		返回 1

	// 发送一个初始的缓冲区
	整型_结果 = 网络_发送(连接套接字, 发送缓存, 文本取长度A(发送缓存), 0)
	如果 (套接字错误 == 整型_结果)
		调试输出("网络_发送 失败:", 网络_获取最后错误信息())
		网络_关闭套接字(连接套接字)
		网络_清理()
		返回 1

	调试输出("已发送字节数:", 整型_结果)

	// 因为不再发送数据，所以关闭连接
	整型_结果 = 网络_关闭套接字IO(连接套接字, SD_SEND)
	如果 (套接字错误 == 整型_结果)
		调试输出("网络_关闭套接字IO 失败:", 网络_获取最后错误信息())
		网络_关闭套接字(连接套接字)
		网络_清理()
		返回 1

	// 循环接收数据，直到对端关闭连接
	整型_结果 = 1
	循环 (整型_结果 > 0)
		整型_结果 = 网络_接收(连接套接字, 接收缓存, 接收大小, 0)
		如果 (整型_结果 > 0)
			调试输出("已接收字节数:", 整型_结果)
		否则 (0 == 整型_结果)
			调试输出("对方连接已关闭")
		否则
			调试输出("网络_接收 失败:", 网络_获取最后错误信息())

		占位

	// 清理
	网络_关闭套接字(连接套接字)
	网络_清理()
	控制台暂停()
	返回 0

//炫语言手册:   http://www.xcgui.com/doc/

//动态库入口函数参考: https://docs.microsoft.com/zh-cn/windows/win32/dlls/dllmain?redirectedfrom=MSDN

//调试快捷键:   F5: 编译和调试, F7: 编译, F9:下断点, F10: 单步, F11: 步入
//函数参数展开: Ctrl+回车: 展开收缩, 表格内回车:收缩, ESC: 取消展开
//TAB:          缩进
//TAB + SHIFT: 减少缩进
//"/":      注释/取消注释
//Ctrl + G: 跳转到指定行
//Ctrl + F: 搜索和替换
//F12:      跳转到定义
//Alt + ↑: 向上交换行
//Alt + ↓: 向下交换行
//home:     移到光标到行首
//end:      移动光标到行尾
//双击打开项目: 系统设置->关联炫彩文件类型

//关于文本编码
//  首先你确定他是一个字符串
//  如果你是二进制数据存在字节集里, 那么显示字符串是乱码的
//  取地址 是单字符型;
//  首先你要指定你字节集里存的是不是文本
//  是单字节 的 还是双字节的
//  文本文件 读到内存 都是单字节字符串 char*;
//  你需要把他转换为 unicode 双字节字符串 wchar_t*
//  调试输出A 是单字节文本
//  你用 单文本型
//  不然你要转换下
//  文本文件一般都是单字节
//  A 与 W 转换
//  ascii和unicode都不清楚的吗
//  A2W()
//  W2A()
//  我一般都用 双字节 字符处理, 比较简单
//  因为中文 如果单字节 会占多个字节
//  还得判断
//
//  文本型    双字节字符串  =  A2W_(data.取地址(),-1)
//  A2W() 就是把易那种字符串 转换为 unicode
//  分割文本, 你就用宽字符串  w wchar_t
//  
//  A =  char  =  单字节
//  w = wchar_t = 双字节 = UNICODE
//
//  你看系统API 都有两个版本
//  CreateWindowA()
//  CreateWindowW()
//  
//  炫语言代码文件是utf-8, 默认编译没有加utf-8选项, 所以ascii文本运行输入任然是ascii文本
//
//  两个文件中结构体类型互相包含导致冲突, 请将结构体定义移动到一个独立文件中
